/**
 * 认证中间件
 * 验证用户JWT令牌
 */
const jwt = require('jsonwebtoken');
const asyncHandler = require('express-async-handler');
const User = require('../models/user');

/**
 * 保护路由中间件
 * 要求用户必须登录才能访问
 */
const protect = asyncHandler(async (req, res, next) => {
  let token;
  
  console.log('验证请求路径:', req.originalUrl);
  console.log('授权头:', req.headers.authorization ? '存在' : '不存在');
  
  // 检查请求头中是否存在token
  if (req.headers.authorization && req.headers.authorization.startsWith('Bearer')) {
    try {
      // 获取token
      token = req.headers.authorization.split(' ')[1];
      console.log('收到令牌:', token.substring(0, 10) + '...');
      
      // 确保JWT_SECRET存在
      const jwtSecret = process.env.JWT_SECRET;
      if (!jwtSecret) {
        console.error('JWT_SECRET环境变量未设置');
        throw new Error('服务器配置错误: JWT密钥未设置');
      }
      
      console.log('使用JWT密钥验证令牌');
      // 验证token
      const decoded = jwt.verify(token, jwtSecret);
      console.log('令牌验证成功，用户ID:', decoded.id);
      
      // 将用户信息添加到请求对象（不含密码）
      req.user = await User.findById(decoded.id).select('-password');
      
      if (!req.user) {
        console.error('找不到用户ID:', decoded.id);
        throw new Error('用户不存在');
      }
      
      console.log('用户已认证:', req.user.username);
      next();
    } catch (error) {
      console.error('认证错误:', error.message);
      res.status(401);
      throw new Error('未授权，令牌无效');
    }
  } else {
    console.error('没有提供令牌');
    res.status(401);
    throw new Error('未授权，没有提供令牌');
  }
});

module.exports = { protect }; 